package com.hy;

import java.util.*;

/**
 * Created With IntelliJ IDEA.
 * Descriptions: 分割回文串
 *
 * 给你一个字符串 s，请你将 s 分割成一些子串，使每个子串都是 回文串 。返回 s 所有可能的分割方案。
 *
 * 回文串 是正着读和反着读都一样的字符串。
 *
 * User:Mr.Du
 * Date:2023/10/10
 * Time:21:05
 */
public class SplitPalindromeString {

    List<List<String>> res = new ArrayList<>();
    LinkedList<String> list = new LinkedList<>();

    public List<List<String>> partition(String s) {
        dfs(s, 0);

        return res;

    }

    /**
     * 从 s 的头部开始暴力穷举，如果发现 s[0..i] 是一个回文子串，那么我们就可以把 s 切分为 s[0..i] 和 s[i+1..]，
     * 然后我们去尝试把 s[i+1..] 去暴力切分成多个回文子串即可。
     * @param s
     * @param start
     */
    public void dfs(String s, int start){
        // 结束条件
        if(start == s.length()){
            res.add(new ArrayList<>(list));
            return;
        }
        for(int i = start;i < s.length();i++){
            if(isValid(s, start, i)){
                list.add(s.substring(start, i + 1));
            }else{
                continue;
            }
            dfs(s, i + 1);
            list.removeLast();
        }
    }

    public boolean isValid(String s, int start, int end){
        while(start < end && s.charAt(start) == s.charAt(end)){
            start++;
            end--;
        }
        return start >= end;
    }
}
